const AI = require('./domain/VloudDomain');
const CSVReader = require('./dao/AIAnalyzeCSVReader');
const NotifyProxy = require('./domain/NotifyProxy');
/*
    AIAnalyzeProxy是本模块的对外接口，也是阅读的入口。
    本模块是vloud的客户端，实现的主要功能：
        1：从csv文件中读取要分析的摄像机列表
        2：批量启动或停止摄像机视频的智能分析
        3：订阅来自vloud的通知，通过通知消息判断摄像机视频的智能分析状态。
    外部调用：
        1:  调用者需要首先调用setCSVPath设置要读取的csv文件
        2： 如果希望订阅来自vloud的通知，需要通过subScribeNotify接口提供通知地址，地址类型为http/https。
        3： 调用者可以通过startAnalyzes接口启动所有摄像机视频的智能分析，也可以通过startAnalyzeById启动单个摄像机视频的智能分析。
        4： 调用者可以通过stopAnalyzes接口停止所有摄像机视频的智能分析，也可以通过stopAnalyzeById停止单个摄像机视频的智能分析。
        5： 如果进行测试，可以通过setAnalyzes设置摄像机，绕开setCSVPath的调用。
        6： 
*/
class AIService {
    constructor(vloud_api, appkey) {
        console.info("begin read csv");
        this._AIAnalyzes = CSVReader.readCSV();
        this._isOnStart = false;
        this._AIAnalyzes.forEach((analyze, id) => {
            console.error(JSON.stringify(analyze) + ";id:" + id + "\r\n");
        });
        this._AIDomain = new AI(vloud_api, appkey, this._AIAnalyzes);
    }

    static setCSVPath(path) {
        CSVReader.setCSVPath(path);
    }

    setAnalyzes(analyzes) {
        this._AIAnalyzes = analyzes;
        this._AIDomain._AIAnalyzes = analyzes;
    }

    subScribeNotify(uri) {
        this._AIDomain.subScribeNotify(uri);
    }

    onNotify(action, app, params) {
        NotifyProxy.onNotify(action, app, params);
    }

    isOnStart() {
        return this._isOnStart;
    }

    startAnalyzes() {
        let ret = this._AIDomain.startAnalyzes();
        this._isOnStart = true;
        return ret;
    }

    stopAnalyzes() {
        let ret = this._AIDomain.stopAnalyzes();
        this._isOnStart = false;
        return ret;
    }
    startAnalyze(analyze) {
        return this._AIDomain.startAnalyze(analyze);
    }

    stopAnalyze(analyze) {
        return this._AIDomain.stopAnalyze(analyze);
    }
    startAnalyzeById(cameraId) {
        return this._AIDomain.startAnalyzeById(cameraId);
    }

    stopAnalyzeById(cameraId) {
        return this._AIDomain.stopAnalyzeById(cameraId);
    }

    getAnalyzeById(cameraId) {
        return this._AIDomain.getAnalyzeById(cameraId);
    }

    getAnalyzes() {
        return this._AIDomain.getAnalyzes();
    }
}

module.exports = AIService;
